// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

var chart;
var timer;
var timeout;
var pontosZoom = [100, 200, 500, 1000, 2000];
var pontosZoomIndice = 2;
var pontosExibidos = pontosZoom[pontosZoomIndice];
var passo = pontosExibidos / 8;
var pontoInicial = 0;

function visualizarChart(comentarios, manterPosicao) {
  var id = $('paciente_id').value;
  var exame = $('paciente_exame_id').value;
  var tipo;

  for(var i = 0; i < $('exame_tipo').children.length; i++) {
    if($('exame_tipo').children[i].checked)
      tipo = $('exame_tipo').children[i].value;
  }

  $('submit_message').hide();

  if(exame == "") {
    chart = null;
    new Proto.Chart($('exame'), [], {});
    if(comentarios)
      $('exame_comentarios').value = "";
  }
  else
  {   
    new Ajax.Request('/dados/exame/visualizar', {
      method: 'post',
      parameters: 'paciente[id]=' + id + '&paciente[exame_id]=' + exame + '&tipo=' + tipo,
      onLoading: loading(),
      onComplete: loaded(),
      onSuccess: function(transport) {
        var data = [];
        var fim;
        var inicio;

        chart = transport.responseText.evalJSON();
        
        if(manterPosicao) {
          fim = pontoInicial + pontosExibidos;
          inicio = pontoInicial;
        }
        else {
          fim = chart.grafico1.data.length;
          inicio = chart.grafico1.data.length - pontosExibidos;
          // Atualiza o ponteiro usado na navegação pelo grafico
          pontoInicial = inicio;
        }

        montarChart(inicio, fim);

        if(comentarios)
          $('exame_comentarios').value = chart.comentarios;
      }
    });
  }
}

function atualizarChart(comentarios) {
  var id = $('paciente_id').value;
  var exame = $('paciente_exame_id').value;
  var tipo;

  for(var i = 0; i < $('exame_tipo').children.length; i++) {
    if($('exame_tipo').children[i].checked)
      tipo = $('exame_tipo').children[i].value;
  }

  $('submit_message').hide();

  if(exame == "" || chart == null) {
    chart = null;
    new Proto.Chart($('exame'), [], {});
    if(comentarios)
      $('exame_comentarios').value = "";
  }
  else
  {    
    new Ajax.Request('/dados/exame/atualizar_grafico', {
      method: 'post',
      parameters: 'paciente[id]=' + id + '&paciente[exame_id]=' + exame + '&tipo=' + tipo + '&ultimo=' + chart.xMax,
      onLoading: loading(),
      onComplete: loaded(),
      onSuccess: function(transport) {
        var fim;
        var inicio;
        var chartNovo;

        chartNovo = transport.responseText.evalJSON();
        
        chart.grafico1.data = chart.grafico1.data.concat(chartNovo.grafico1.data);
        chart.grafico2.data = chart.grafico2.data.concat(chartNovo.grafico2.data);
        chart.grafico3.data = chart.grafico3.data.concat(chartNovo.grafico3.data);
        chart.xMax = chartNovo.xMax;
        
        // Verifica se os maximos dos graficos se alteraram
        if(chart.grafico1.yMax < chartNovo.grafico1.yMax)
          chart.grafico1.yMax = chartNovo.grafico1.yMax;
        if(chart.grafico2.yMax < chartNovo.grafico2.yMax)
          chart.grafico2.yMax = chartNovo.grafico2.yMax;
        if(chart.grafico3.yMax < chartNovo.grafico3.yMax)
          chart.grafico3.yMax = chartNovo.grafico3.yMax;

        // Verifica se os minimos dos graficos se alteraram
        if(chart.grafico1.yMin > chartNovo.grafico1.yMin)
          chart.grafico1.yMin = chartNovo.grafico1.yMin;
        if(chart.grafico2.yMin > chartNovo.grafico2.yMin)
          chart.grafico2.yMin = chartNovo.grafico2.yMin;
        if(chart.grafico3.yMin > chartNovo.grafico3.yMin)
          chart.grafico3.yMin = chartNovo.grafico3.yMin;

        fim = chart.grafico1.data.length;
        inicio = chart.grafico1.data.length - pontosExibidos;
        // Atualiza o ponteiro usado na navegação pelo grafico
        pontoInicial = inicio;

        montarChart(inicio, fim);

        if(comentarios)
          $('exame_comentarios').value = chart.comentarios;
      }
    });
  }
}

function montarChart(inicio, fim) {
  var data = [];
  var grafico1 = $('paciente_exame_1').checked;
  var grafico2 = $('paciente_exame_2').checked;
  var grafico3 = $('paciente_exame_3').checked;
  var yMax = 0;
  var yMin = 1.0/0; // Infinito

  if(chart.grafico1 != null)
    $('grafico_nome_1').innerHTML = chart.grafico1.label;
  if(chart.grafico2 != null)
    $('grafico_nome_2').innerHTML = chart.grafico2.label;
  if(chart.grafico3 != null)
    $('grafico_nome_3').innerHTML = chart.grafico3.label;

  if(grafico1) {
    data.push({data: chart.grafico1.data.slice(inicio, fim), label: chart.grafico1.label});
    if(yMax < chart.grafico1.yMax) {
      yMax = chart.grafico1.yMax;
    }
    if(yMin > chart.grafico1.yMin) {
      yMin = chart.grafico1.yMin;
    }
  }
  if(grafico2) {
    data.push({data: chart.grafico2.data.slice(inicio, fim), label: chart.grafico2.label});
    if(yMax < chart.grafico2.yMax) {
      yMax = chart.grafico2.yMax;
    }
    if(yMin > chart.grafico2.yMin) {
      yMin = chart.grafico2.yMin;
    }
  }
  if(grafico3) {
    data.push({data: chart.grafico3.data.slice(inicio, fim), label: chart.grafico3.label});
    if(yMax < chart.grafico3.yMax) {
      yMax = chart.grafico3.yMax;
    }
    if(yMin > chart.grafico3.yMin) {
      yMin = chart.grafico3.yMin;
    }
  }

  new Proto.Chart($('exame'),
    data,
    {
      xaxis: {tickSize: chart.xTick,
              tickFormatter: function (valor) { 
                if(valor % (chart.xTick * 5) == 0)
                  return "|";
                else
                  return "";}
              },
      yaxis: {min: yMin, max: yMax},
      legend: {show: true}
    });
}

function remontarChart() {
  $('submit_message').hide();
  montarChart(pontoInicial, pontoInicial + pontosExibidos);
}

function configAtualizacaoChart() {
  var tempoReal = $('paciente_exame_live').checked;

  $('submit_message').hide();

  if(tempoReal) {
    timeout = 2000;
    timer = setTimeout('atualizarTimeChart()', timeout);
  }
  else if (timer != null) {
    clearTimeout(timer);
  }
}

function atualizarTimeChart() {
  atualizarChart(false);
  timer = setTimeout('atualizarTimeChart()', timeout);
}

function moverParaDireita() {
  if (chart != null) {
    pontoInicial = pontoInicial + passo;
    if (pontoInicial + pontosExibidos >= chart.grafico1.data.length) {
      if (chart.grafico1.data.length - pontosExibidos < 0)
        pontoInicial = 0;
      else
        pontoInicial = chart.grafico1.data.length - pontosExibidos;
    }
    remontarChart();
  }
}

function moverParaEsquerda() {
  if (chart != null) {
    pontoInicial = pontoInicial - passo;
    if (pontoInicial < 0) {
      pontoInicial = 0;
    }
    remontarChart();
  }
}

function reduzir() {
  if (chart != null) {
    if (pontosZoomIndice < pontosZoom.length - 1) {
      pontosZoomIndice++;
      pontosExibidos = pontosZoom[pontosZoomIndice];
      // Aplica correcao para o primeiro ponto exibido
      if (pontoInicial + pontosExibidos >= chart.grafico1.data.length) {
        if (chart.grafico1.data.length < pontosExibidos)
          pontoInicial = 0;
        else
          pontoInicial = chart.grafico1.data.length - pontosExibidos;
      }
      passo = pontosExibidos / 8;
    }
    remontarChart();
  }
}

function ampliar() {
  if (chart != null) {
    if (pontosZoomIndice > 0) {
      pontosZoomIndice--;
      pontosExibidos = pontosZoom[pontosZoomIndice];
      // Aplica correcao para o primeiro ponto exibido
      if (pontoInicial + pontosExibidos >= chart.grafico1.data.length) {
        if (chart.grafico1.data.length < pontosExibidos)
          pontoInicial = 0;
        else
          pontoInicial = chart.grafico1.data.length - pontosExibidos;
      }
      passo = pontosExibidos / 8;
    }
    remontarChart();
  }
}

